package cn.xuqiudong.rpc.cluster.balance;

import cn.xuqiudong.rpc.common.annotathion.XqdExtension;
import cn.xuqiudong.rpc.common.constants.ConfigKey;
import cn.xuqiudong.rpc.cluster.exception.XqdCommonException;
import cn.xuqiudong.rpc.common.model.Invoker;
import cn.xuqiudong.rpc.common.model.XqdUrl;

import java.util.List;

/**
 * 描述:负载均衡策略
 * @author Vic.xu
 * @date 2022-02-23 10:58
 */
@XqdExtension(value = "random", configKey = ConfigKey.BALANCE_CONFIG)
public interface LoadBalance {

    /**
     * 通过负载策略查找合适的url
     * @param urls
     * @param invoker
     * @return
     */
    XqdUrl doSelect(List<XqdUrl> urls, Invoker invoker);

    /**
     *  如果urls为空则抛出异常，如果只有1条，则直接返回，否则通过具体的负载策略查找合适的url
     * @param urls
     * @param invoker
     * @return
     */
    default XqdUrl select(List<XqdUrl> urls, Invoker invoker){
        if (urls == null || urls.isEmpty()) {
            throw new XqdCommonException("urls is  null");
        }
        if (urls.size() == 1) {
            return urls.get(0);
        }
        return doSelect(urls, invoker);

     }
}
